package com.dengcj.epl.service.ecology.workflow.action;

import cn.hutool.db.Entity;
import com.dengcj.epl.dao.DB;
import com.dengcj.epl.enums.ecology.workflow.RequestSrc;
import com.dengcj.epl.service.ecology.workflow.EcologyNodeAction;
import com.dengcj.epl.entity.ecology.workflow.EcologyRequestInfo;
import com.dengcj.epl.entity.ecology.workflow.NodeExecuterResult;

import java.util.List;
import java.util.Map;

/**
 * @author dengchunjie
 * @Description: 节点操作模板类，供参考
 * @date 2022/1/12 19:33
 */
public class TemplateAction implements EcologyNodeAction {

    @Override
    public NodeExecuterResult execute(EcologyRequestInfo requestInfo) {
        NodeExecuterResult nodeExecuterResult = new NodeExecuterResult();
        // 流程表名
        String tableName = requestInfo.getTableName();

        // 工作流请求ID
        int requestid = requestInfo.getRequestId();

        // 工作流ID
        int workflowid = requestInfo.getWorkflowId();

        // 节点ID
        int nodeid = requestInfo.getNodeId();

        // 创建人ID
        int creator = requestInfo.getCreator();

        // 动作来源 submit为提交 reject为退回
        RequestSrc src = requestInfo.getSrc();
        if(src == RequestSrc.Reject){

        }

        // 主表数据
        Entity mainData = requestInfo.getMainData();
        // 根据数据库字段名获取对应数据
        String name = mainData.getStr("name");
        int age = mainData.getInt("age");
        double price = mainData.getDouble("price");

        // 流程所有明细表数据
        Map<String, List<Entity>> detailData = requestInfo.getDetailData();
        // 获取明细表1的所有行 dt+明细表编号
        List<Entity> dt1List = detailData.get("dt1");
        // 遍历明细行
        dt1List.forEach(entity -> {
            System.out.println(entity.getStr("content"));
        });

        // 数据库操作
        DB db = new DB();
        // 查询
        List<Entity> entities = db.query("select * from test01");
        // 查询单行
        Entity entity = db.queryOne("select * from test01 where id=?", 1);
        // delete、update 返回受影响行数
        int rowCount = db.execute("update test01 set name=? where id=?", name, 1);
        // insert返回主键
        Long newId = db.insert("insert into test01 values(?,?,?)", name, age, price);

        if(newId < 1){
            // 设置错误消息标题
            nodeExecuterResult.setMsgTitle("创建失败");
            // 添加明细错误提示
            nodeExecuterResult.addMsg("明细消息1");
            nodeExecuterResult.addMsg("明细消息2");

            /*
            自动格式化输出样式：

                消息标题
                · 明细消息1
                · 明细消息2
                · 明细消息3
            */

            // 调用setFailed()后会阻断流程提交，如果调用了addMsg()则会自动设置失败状态，无需再调用调用setFailed()
            nodeExecuterResult.setFailed();
        }

        return nodeExecuterResult;
    }
}
